/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package biermanager.nucleo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Random;

/**
 *
 * @author Tiago Silva Loureiro
 */
public class Sorteio {
    /**
     * Gera Campeonato com um combate entre cada time
     * a partir da lista de times de entrada.
     * @param times
     * @return campeonato
     */
    @SuppressWarnings("unchecked")
        //Array de colecoes nao permitido apos versao tiger java...
        //rodadasArray
        //Todo: implementar colecao de colecoes : )
        //Todo2: me lembrar do que eu fiz aqui!
        
    public static Campeonato SortearCampeonato(ArrayList<Time> times) {
        //Alterar para true caso esteja debugando com print's
        boolean MODODEBUG = false;
        int numTimes = times.size();
        int numRodadas = times.size() - 1;
        int numPartidas = times.size() / 2;
        ArrayList<int[]> jogos = new ArrayList<int[]>();
        for (int i = 0; i < numTimes; i++) {
            for (int j = i + 1; j < numTimes; j++) {
                if (i != j) {
                    jogos.add(new int[]{i, j});
                }
            }
        }
        ArrayList<Integer> pesos = new ArrayList<Integer>();
        ArrayList<Integer> pesosSemIndice = new ArrayList<Integer>();
        Iterator it = jogos.iterator();
        while (it.hasNext()) {
            int[] temp = (int[]) it.next();
            pesos.add(temp[0] + temp[1]);
            if (MODODEBUG) {
                System.out.print(temp[0] + " " + temp[1]);
                System.out.println();
            }
        }
        System.out.println();
        pesos.trimToSize();
        Object[] pesosArray = pesos.toArray();
        Arrays.sort(pesosArray);
        for (int i = 0; i < pesosArray.length; i++) {
            pesosSemIndice.add((Integer) pesosArray[i]);
        }
        pesosSemIndice.trimToSize();
        ArrayList<Integer>[] rodadasArray = new ArrayList[numTimes - 1];
        for (int i = 0; i < numTimes - 1; i++) {
            rodadasArray[i] = new ArrayList<Integer>();
        }
        while (!(pesosSemIndice.isEmpty())) {
            int pesoAtual = pesosSemIndice.get(0);
            if (pesoAtual < numTimes && rodadasArray[pesoAtual - 1].size() < numTimes / 2) {
                rodadasArray[pesoAtual - 1].add(pesos.indexOf(pesoAtual));
                pesos.set(pesos.indexOf(pesoAtual), -pesoAtual);
                pesosSemIndice.remove(0);
            } else {
                for (int i = 0; i < numTimes - 1; i++) {
                    if (rodadasArray[i].size() != numTimes / 2) {
                        ArrayList<Integer> preenchidos = new ArrayList<Integer>();
                        for (int j = 0; j < rodadasArray[i].size(); j++) {
                            preenchidos.add(jogos.get((Integer) rodadasArray[i].get(j))[0]);
                            preenchidos.add(jogos.get((Integer) rodadasArray[i].get(j))[1]);
                        }
                        int time1 = jogos.get(Math.abs(pesos.indexOf(pesoAtual)))[0];
                        int time2 = jogos.get(Math.abs(pesos.indexOf(pesoAtual)))[1];
                        if (preenchidos.indexOf(time1) < 0 && preenchidos.indexOf(time2) < 0) {
                            rodadasArray[i].add(pesos.indexOf(pesoAtual));
                            pesos.set(pesos.indexOf(pesoAtual), -pesoAtual);
                            break;
                        }

                    }
                }
                pesosSemIndice.remove(0);
            }

        }
        if (MODODEBUG) {
            for (int i = 0; i < numTimes - 1; i++) {
                Iterator itt = rodadasArray[i].iterator();
                while (itt.hasNext()) {
                    int[] temp = jogos.get((Integer) itt.next());
                    System.out.println(temp[0] + " " + temp[1]);
                }
                System.out.println("--------");
            }
        }
        Rodada[] rodadas = new Rodada[numRodadas];
        Partida[] partidas = new Partida[numPartidas];
        ArrayList<Integer> rodadasDisponiveis = new ArrayList<Integer>();
        for (int i = 0; i < numRodadas; i++) {
            rodadasDisponiveis.add(i);
        }
        for (int i = 0; i < numRodadas; i++) {
            Random random = new Random(System.currentTimeMillis());
            int indice = random.nextInt(rodadasDisponiveis.size());
            int elemento = rodadasDisponiveis.get(indice);
            rodadasDisponiveis.remove(indice);
            Iterator itt = rodadasArray[elemento].iterator();
            rodadas[i] = new Rodada();
            int j = 0;
            while (itt.hasNext()) {
                partidas[j] = new Partida();
                int[] temp = jogos.get((Integer) itt.next());
                partidas[j].setIndiceDoTimeDaCasa(temp[0]);
                partidas[j].setIndiceDoTimeVisitante(temp[1]);
                j++;
            }
            rodadas[i] = new Rodada(partidas);
        }
        if (MODODEBUG) {
            for (int i = 0; i < rodadas.length; i++) {
                for (int j = 0; j < rodadas[i].getTamanho(); j++) {
                    System.out.println(rodadas[i].getPartida(j).getIndiceDoTimeDaCasa() + " " + rodadas[i].getPartida(j).getIndiceDoTimeVisitante());
                }
                System.out.println("--------------");
            }
        }
        Campeonato campeonato = new Campeonato(rodadas, times.size());
        return campeonato;
    }
    //TODO: Implementar metodo sortearCopa!
    public static Copa SortearCopa(ArrayList<Time> times) {
        return new Copa();
    }

}
